package ar.com.cubika.trainees.bean.transportes;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;

import ar.com.cubika.trainees.bean.transportes.actividades.Viaje;
import ar.com.cubika.trainees.bean.transportes.vehiculos.Vehiculo;

/**
 * @author Carlos
 */
public class Empresa {
    
    private static Empresa instance;
    
    public static synchronized Empresa getInstance() {
        return instance;
    }

    public static synchronized void setInstance(Empresa instance) {
        Empresa.instance = instance;
    }
    
    private static List<Chofer> choferes;
    private Map<String,Vehiculo> vehiculos;
    private String nombre;
    
    public Empresa() {
        vehiculos = new HashMap<String, Vehiculo>();
        choferes = new ArrayList();
    }
    
    /**
     * Devuelve el conjunto de vehiculos que puede hacer un
     * determinado viaje.
     * @param viaje el viaje a analizar 
     */
    public Collection vehiculosAptosParaViaje(final Viaje viaje) {
        return CollectionUtils.select(
                this.getVehiculos(), 
                new Predicate() {
            public boolean evaluate(Object arg0) {
                Vehiculo veh = (Vehiculo)arg0;
                return veh.puedeHacer(viaje);
        }});
    }

    /**
     * los vehiculos de la empresa
     */
    public Collection<Vehiculo> getVehiculos() {
        return this.vehiculos.values();
    }
    
    /**
     * Le agregan un vehiculo a la empresa
     * @param veh el vehiculo a agregar
     */
    public void addVehiculo(Vehiculo veh) {
        this.vehiculos.put(veh.getPatente(),veh);
    }
    
    /**
     * Devuelve el consumo total de los viajes asignados a algun vehiculo,
     * calculandolo para el vehiculo al que fue asignado el viaje.
     */
    public double getConsumoTotalViajesAsignados() {
        double total = 0;
        for (Iterator vehIter = this.getVehiculos().iterator(); vehIter.hasNext();) {
            Vehiculo veh = (Vehiculo) vehIter.next();
            total += veh.getConsumoTotalViajesAsignados();
        }
        return total;
    }

    public Vehiculo getVehiculo(String patente) {
        return this.vehiculos.get(patente);
    }

    public void setNombre(String nombre) {
       this.nombre = nombre;
    }

    public String getNombre() {
        return this.nombre;
    }

    
    /**
     * Le agrega un chofer a la empresa
     * @param cho chofer a agregar
     * @return 
     */
    
    public static synchronized void addChofer(Chofer cho) {
        Empresa.choferes.add(cho);
    }

    public static synchronized List<Chofer> getChoferes(){
    	return choferes;
    	
    }

}
